package com.ruicar.afs.cloud.basic.proceeds.debit.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruicar.afs.cloud.basic.proceeds.debit.condition.SingleDebitCondition;
import com.ruicar.afs.cloud.basic.proceeds.debit.entity.BasicDebitRecord;
import com.ruicar.afs.cloud.basic.proceeds.debit.vo.SingleDebitReadyVo;
import com.ruicar.afs.cloud.common.modules.contract.enums.DebitStatusEnum;
import com.ruicar.afs.cloud.manage.api.dto.PrepaymentDebitDealStatusDto;
import com.ruicar.afs.cloud.manage.api.dto.PrepaymentInfoDto;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * @author: Lee
 * @date 2020-05-30 04:34:35 
 * @description 
 */
public interface BasicDebitRecordService extends IService<BasicDebitRecord> {
    
    /**
     * 判断是否可以干涉待扣款数据
     * @author ZC.GUO
     * @param contractNo 合同号
     * @return 
     */
    public boolean isAllowedChangeRecord(String contractNo);

    /**
     * 重新生成某一合同的待扣款数据
     * @author ZC.GUO
     * @param contractNo 合同号
     * @return
     */
    public void addDebitRecordList(String contractNo, Date batchDate);

    /**
     *
     * <p>Description: 生成所有符合代扣条件的合同的代扣数据</p>
     *
     * @param prepaymentInfoDto 提前结清数据
     * @return
     */
    public PrepaymentDebitDealStatusDto dealRecordForPrepaymentImmediately(PrepaymentInfoDto prepaymentInfoDto, Date batchDate);
    /**
     * 将提前结清扣款指令插入数据库
     * @author ZC.GUO
     * @param prepaymentInfoDto 提前结清数据
     * @param status 扣款状态
     * @return
     */
    public void addSingleDebitRecordForPrepayment(PrepaymentInfoDto prepaymentInfoDto, DebitStatusEnum status, Date batchDate);

    /**
     *
     * <p>Description: 生成所有符合代扣条件的合同的代扣数据</p>
     *
     * @param
     * @return
     */
    public void addDebitRecordList(Date batchDate);


    /**
     * 生成扣款批次时更新待扣款明细
     * @author ZC.GUO
     * @param basicDebitRecord 需要更新的待扣款明细
     * @return 
     */
    public void updateDebitRecordPrepare(BasicDebitRecord basicDebitRecord);
    /**
     * 扣款失败时更新待扣款明细
     * @author ZC.GUO
     * @param basicDebitRecord 需要更新的待扣款明细
     * @return
     */
    public void updateDebitRecordFailed(BasicDebitRecord basicDebitRecord);
    /**
     * 扣款成功时更新待扣款明细
     * @author ZC.GUO
     * @param basicDebitRecord 需要更新的待扣款明细
     * @return
     */
    public void updateDebitRecordSucceed(BasicDebitRecord basicDebitRecord);

    /**
     * 按条件查询可以进行单笔代扣的合同集合
     * @author ZC.GUO
     * @param page 分页对象
     * @param query 查询条件封装
     * @return
     */
    public IPage<SingleDebitReadyVo> selectSingleDebitReadyContract(Page page, @Param("query") SingleDebitCondition query);
    /**
     * 根据合同编号查询待扣款信息
     * @author ZC.GUO
     * @param contractNo 合同编号
     * @return
     */
    public BasicDebitRecord selectAmountAndTimeByContractNo(@Param("contractNo") String contractNo);



    /**
     * 根据扣款降档规则处理待扣款明细数据
     * @author ZC.GUO
     * @param recordList 待扣款数据
     * @return
     */
    public List<BasicDebitRecord> handleRecordListWhenDownGrade(List<BasicDebitRecord> recordList,BasicDebitRecord record);
}
